From 41d7f059c533722c4ed01ef1c278dab0d006e3e5 Mon Sep 17 00:00:00 2001 From: "Ian.Campbell@xensource.com" Date: Fri, 21 Apr 2006 17:18:53 +0100 Subject: [PATCH] Use set_callbacks hypercall if callback_op is not available. Signed-off-by: Ian Campbell --- .../include/asm-i386/mach-xen/setup_arch_post.h | 11 +++++++++-- .../include/asm-x86_64/mach-xen/setup_arch_post.h | 15 ++++++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch_post.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch_post.h index 71d0258b8d..5107aacd4d 100644 --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch_post.h +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch_post.h @@ -24,6 +24,7 @@ extern void nmi(void); static void __init machine_specific_arch_setup(void) { + int ret; struct xen_platform_parameters pp; struct callback_register event = { .type = CALLBACKTYPE_event, @@ -42,8 +43,14 @@ static void __init machine_specific_arch_setup(void) memset(empty_zero_page, 0, sizeof(empty_zero_page)); } - HYPERVISOR_callback_op(CALLBACKOP_register, &event); - HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe); + ret = HYPERVISOR_callback_op(CALLBACKOP_register, &event); + if (ret == 0) + ret = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe); + if (ret == -ENOSYS) + ret = HYPERVISOR_set_callbacks( + event.address.cs, event.address.eip, + failsafe.address.cs, failsafe.address.eip); + BUG_ON(ret); cb.handler_address = (unsigned long)&nmi; HYPERVISOR_nmi_op(XENNMI_register_callback, &cb); diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_post.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_post.h index f2342b0097..725ea90c03 100644 --- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_post.h +++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_post.h @@ -14,6 +14,7 @@ extern void nmi(void); static void __init machine_specific_arch_setup(void) { + int ret; struct callback_register event = { .type = CALLBACKTYPE_event, .address = (unsigned long) hypervisor_callback, @@ -30,9 +31,17 @@ static void __init machine_specific_arch_setup(void) struct xennmi_callback cb; #endif - HYPERVISOR_callback_op(CALLBACKOP_register, &event); - HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe); - HYPERVISOR_callback_op(CALLBACKOP_register, &syscall); + ret = HYPERVISOR_callback_op(CALLBACKOP_register, &event); + if (ret == 0) + ret = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe); + if (ret == 0) + ret = HYPERVISOR_callback_op(CALLBACKOP_register, &syscall); + if (ret == -ENOSYS) + ret = HYPERVISOR_set_callbacks( + event.address, + failsafe.address, + syscall.address); + BUG_ON(ret); #ifdef CONFIG_X86_LOCAL_APIC cb.handler_address = (unsigned long)&nmi; -- 2.30.2